Percona Xtrabackup 2.4 恢复指定表
在5.6之前的服务版本,在不同的MySQL服务中通过复制表的文件来拷贝表是不可能的,即使启用了innodb_file_per_table。然而,通过Percona XtraBackup,可以从任意的InnoDB数据库中导出指定的表,并将它们导入到使用XtraDB的Percona服务中或MySQL 5.6。这只对.ibd文件有效。
创建测试表
CREATE TABLE `export_test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`a` varchar(60) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 ROW_FORMAT=DYNAMIC DEFAULT CHARSET=utf8
insert into `test`.`export_test` ( `a`) values ( 'aaa');
insert into `test`.`export_test` ( `a`) values ( 'ddd');
insert into `test`.`export_test` ( `a`) values ( 'ccc');
insert into `test`.`export_test` ( `a`) values ( 'dddccc');
确认innodb_file_per_table是否开启
mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.00 sec)
确认行格式
show variables like '%format%';
+---------------------------+-------------------+
| Variable_name | Value |
+---------------------------+-------------------+
| binlog_format | ROW |
| date_format | %Y-%m-%d |
| datetime_format | %Y-%m-%d %H:%i:%s |
| default_week_format | 0 |
| innodb_default_row_format | dynamic |
| innodb_file_format | Barracuda |
| innodb_file_format_check | ON |
| innodb_file_format_max | Barracuda |
| time_format | %H:%i:%s |
+---------------------------+-------------------+
9 rows in set (0.00 sec)
执行备份
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=xxxx --socket=/tmp/mysql.sock ~/backup/fullbackup/
导出的表必须是以 innodb_file_per_table 格式创建,在备份目录中以.bd文件格式存在。
find . -name export_test.*
./guo_test/export_test.ibd
./guo_test/export_test.frm
当准备备份的时候,增加xtrabackup –export参数到命令中。
innobackupex --user=root --password=root --no-timestamp --apply-log --export ./
在目标目录下,可以看到.exp文件
find . -name export_test.*
./guo_test/export_test.ibd
./guo_test/export_test.exp
./guo_test/export_test.cfg
./guo_test/export_test.frm
.exp、.ibd、.cfg这三个文件用于数据库导入中
Percona官方对这三个文件的描述
After this, copy mytable.ibd and mytable.exp ( or mytable.cfg if importing to MySQL 5.6) files to database’s home, and import its tablespace:
删除表 (如果表结构一致可以不用删除)
drop table export_test;
Query OK, 0 rows affected (1.45 sec)
在目标MySQL服务器上,创建一张具有相同结构的空表。
CREATE TABLE `export_test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`a` varchar(60) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 ROW_FORMAT=DYNAMIC DEFAULT CHARSET=utf8
清除表空间
ALTER TABLE export_test DISCARD TABLESPACE;
拷贝导出文件到数据目录中
cp -f ~/export_test.* ./
更改文件权限为mysql
chown -R mysql:mysql .
导入表空间
ALTER TABLE export_test IMPORT TABLESPACE;
验证表中的数据
mysql> select * from `test`.`export_test`;
+----+--------+
| id | a |
+----+--------+
| 1 | aaa |
| 2 | ddd |
| 3 | ccc |
| 4 | dddccc |
+----+--------+
4 rows in set (0.02 sec)
mysql>
常见错误
ERROR 1815 (HY000): Internal error: Cannot reset LSNs in table '"test"."export_test"' : Tablespace not found
查看export文件权限、export文件是否都已经导入到数据库目录
ERROR 1030 (HY000): Got error -1 from storage engine
检查innodb_file_per_table是否开启
Error : Schema mismatch (Table flags don't match, server table has 0x0 and the meta-data file has 0x1)
检查表ROW_FORMAT、innodb_file_format
以前支持COMPACT、REDUNDANT的innodb_file_format文件格式为Antelope,新的文件格式为Barracuda,新增格式Compressed、dynamic
innodb_file_format
Default Value (>= 5.7.7) Barracuda
Default Value (<= 5.7.6) Antelope